package com.os.ch1.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author Matt
        * @Date 2022-01-10
        * @Desc: 编写切面
        * @Version V1.0
        */
@Aspect  //注解声明一个切面
@Component  //让此切面成为spring容器管理的bean
public class LogAspect {

    @Pointcut("@annotation(com.os.ch1.aop.Action)")  //注解声明切点
    public void annotationPointCut(){}

    @After("annotationPointCut()")  //after声明一个建言，并使用pointcut定义的切点
    public void after(JoinPoint joinpoint){
        MethodSignature signature = (MethodSignature)joinpoint.getSignature();
        Method method = signature.getMethod();
        Action action = method.getAnnotation(Action.class);
        System.out.println("注解式拦截：" + action.name());  //通过反射可以获得注解上的属性，然后做日志记录相关的操作
    }

    @Before("execution(* com.os.ch1.aop.DemoMethodService.*(..))")  //通过before注解声明一个建言，此建言直接使用拦截规则作为参数
    public void before(JoinPoint joinpoint){
        MethodSignature signature = (MethodSignature)joinpoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("方法规则式拦截：" + method.getName());
    }


}
